
/**
 * @author jcl_hqu
 * @date 2021/3/30 19:43
 */


public class ShareMemory {
    /**
     * 线程通信
     */
    private int data;          // 共享数据
    private boolean userTag_p; //生产者使用标记
    private boolean userTag_c; //消费者使用标记
    private int ban; // 禁止哪个使用内存 1表示禁止生产者使用 -1表示禁止消费者使用
    private int size=100;

    /**
     *   生产者进行生产
     * @throws InterruptedException
     */
    public void producer() throws InterruptedException {
        int count=0; // 记录生产次数
        long start=0; // 初始时间
        long end=0; // 初始时间
        start=System.currentTimeMillis();
        while (count<size){

            Thread.sleep(5);    // 生产者休眠5ms
            userTag_p=true;            // 生产者进入内存
            ban=-1;                     // 禁止消费者进入
            while (userTag_c==true&&ban==-1);

                         /* 进入临界区 */

            if (data>size){ //库存满不生产
                System.out.println("生产者("+count+")不生产");
            }else{
                // 生产
                data++;
                count++;
                System.out.println("生产者("+count+")生产，库存"+data);
            }
            userTag_p=false;
                        /* 退出临界区  */
        }
        end=System.currentTimeMillis();
        System.out.println("生产者线程运行时间："+(end-start));
    }



    /**
     *  消费者进行消费
     * @throws InterruptedException
     */
    public void consumer() throws InterruptedException {
        int count = 0; // 记录消费次数
        long start=0; // 初始时间
        long end=0; // 初始时间
        start=System.currentTimeMillis();
        while (count < size) {
            Thread.sleep(10); // 消费者休眠10ms
            userTag_c = true;       //  消费者进入内存
            ban = 1;                // 禁止使用生产者
            while (userTag_p == true && ban == 1) ; //

                         /* 进入临界区 */

            if (data <= 0) { //  库存为空不消费
                System.out.println("消费者(" + count + ")不消费");
            } else {
                data--;
                count++;
                System.out.println("消费者(" + count + ")消费，库存" + data);
            }
            userTag_c = false;

                        /* 退出临界区  */
        }
        end=System.currentTimeMillis();
        System.out.println("消费者线程运行时间："+(end-start));
    }

    /**
     *   主函数测试
     * @param args
     */
    public static void main(String args[]){
        ShareMemory task=new ShareMemory(); //共享数据类

        MyThread myThread1=new MyThread(){
            @Override
            public void run() {
                super.run();
                try {
                    task.producer();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        MyThread myThread2=new MyThread(){
            @Override
            public void run() {
                super.run();
                try {
                    task.consumer();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        myThread2.start();  //启动消费者
        myThread1.start();  //启动生产者
    }
}
